/*
 【入门】二分查找右侧边界
  题目描述
    请在一个有序不递减的数组中（数组中的值有相等的值），采用二分查找，
    找到最后 1 次出现值 x 的位置，如果不存在 x 请输出 -1。
    请注意：本题要求出 q 个 x，每个 x 在数组中最后一次出现的位置。
    比如有 6 个数，分别是：1 2 2 2 3 3，那么如果要求 3 个数：3 2 5，在数组中最后一次出现的位置，答案是：6 4 -1。
  输入
    第一行，一个整数 n，代表数组元素个数（n <= 10^5）
    第二行，n 个整数，用空格隔开，代表数组的 n 个元素（1 <= 数组元素的值 <= 10^8）
    第三行，一个整数 q，代表有要求出 q 个数最后一次出现的位置（q <= 10^5）
    第四行，q 个整数，用空格隔开，代表要找的数（1 <= 要找的数 <= 10^8）
  输出
    按题意输出位置或者 -1。
  样例输入
    6
    1 2 2 2 3 3
    3
    3 2 5
  样例输出
    6 4 -1
*/

#include <bits/stdc++.h>

using namespace std;

long long a[100005] = {}; // 输入数组
int n, q;

/*
  该函数返回整形数 x 在有序不递减整形序列 a[1] ~ a[n] 中最后一次出现的位置(右侧边界)
  输入参数 x 为整形数
  如果可以找到 x，则返回值为对应的下标值 (1 ~ n)；否则，返回 -1, 表示不存在 x 这样的数.
*/
int f(int x) {
    /*
      s 和 e 确定了二分查找的数据范围(对应的下标),
        其中, s (start) 为开始下标(左下标), e (end) 为结束下标(右下标);
    */
    int s = 1, e = n;
    while (s <= e) { // 注意: 如果 s == e时, 则还有数据没查找完；s > e时, 数据已遍历完
        int m = (s + e) / 2;      // m 为二分查找算法使用的中间下标
        if (x < a[m]) {
            e = m - 1;
        } else if (x > a[m]) {
            s = m + 1;
        } else if (a[m] == x) {
            /*
              如果 "中间下标处的值" 和 "其右边的值" 相等, 则还要继续查找
              否则, 则说明中间下标 m 为 x 最后一次出现的位置
            */
            if (a[m + 1] == x) {
                s = m + 1;
            } else {
                return m;
            }
        }
    }

    return -1;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    cin >> q;
    int x;
    for (int i = 1; i <= q; i++) {
        cin >> x;
        cout << f(x) << " ";
    }

    return 0;
}